package com.ljx.reflect.reflect03;

import java.lang.reflect.Field;

/**
 * @author LJX
 * @Description: 反射：在运行时把类中成员抽取到其他类的过程
 * @Date: 2022/10/27 9:58
 * @Version 1.0
 */
public class Test01 {
	public static void main(String[] args) throws Exception{

	/*	 // 通过反射类对象，得到此类的对象
		Class<Ljx> ljxClass = Ljx.class;
		Ljx ljx = ljxClass.newInstance();
		Ljx ljx1 = ljxClass.newInstance();
		System.out.println(ljx==ljx1);

		Class<Ljx> ljxClass = Ljx.class;
		// 获取本类中指定的属性对象
		Field name = ljxClass.getDeclaredField("name");
		System.out.println(name);
		// 获取本类中所有属性对象
		Field[] declaredFields = ljxClass.getDeclaredFields();
		for (Field declaredField : declaredFields) {
			System.out.println(declaredField);
		}

		 // 获取本类以及父类中指定的public属性
		Field name = ljxClass.getField("name");
		Field address = ljxClass.getField("address");
		Field tel = ljxClass.getField("tel");
		System.out.println(name);
		// 只能获取本类中或者父类中公共属性
		System.out.println(address);


		//获取本类以及父类中所有public属性
		Field[] fields = ljxClass.getFields();
		for (Field field : fields) {
			System.out.println(field);
		}
*/

		// 获取class类对象，
		Class<Ljx> ljxClass = Ljx.class;
		// 通过反射类获取对应的类对象
		Ljx ljx = ljxClass.newInstance();
		System.out.println(ljx);
		// 获取本类中指定的属性对象
		Field name = ljxClass.getDeclaredField("name");
		// 通过反射为属性对象赋值，name.set(反射获取的类对象,属性值)
		name.set(ljx,"李吉星");
		System.out.println(ljx);
		// 得到属性的值name.get(通过反射获取的本类对象)
		Object o = name.get(ljx);
		System.out.println(o);
		System.out.println("~~~~~~~~~~~~~~~~");
		// 得到本类中指定的属性对象
		Field age = ljxClass.getDeclaredField("age");
		// 此属性对象是私有的，无法直接为私有属性赋值所以需要设置允许赋值，取值。
		// setAccessible允许赋值取值
		age.setAccessible(true);
		// 为属性对象赋值
		age.set(ljx,18);
		System.out.println(ljx);
		// 得到属性对象的值
		Object o1 = age.get(ljx);
		System.out.println(o1);


	}
}

class Lhf{
	private String address;
	public   int tel;
}

class Ljx extends Lhf{
	public String name;
	private Integer age;

	@Override
	public String toString() {
		return "Ljx{" +
				"name='" + name + '\'' +
				", age=" + age +
				'}';
	}
}